<?php
require_once(realpath(DOCUMENT_ROOT) . PROJECT_BASE . AJAXLIBRARYPATH . 'JSON.php');
require_once(realpath(DOCUMENT_ROOT) . PROJECT_BASE . AJAXLIBRARYPATH . 'AjaxHandler.php');

/**
 * JsonHandler gibt die Ausgabe von Seitenaufrufen von Controller-Funktionen
 * in JSON (JavaScript Object Notation) zur�ck.<br>
 * Dies erlaubt die Weiterverarbeitung der Daten in JavaScript.<br>
 * Die Seiten werden typischerweise mit einem XmlHttpRequest-Aufruf geladen.
 * @author Hanno Stock
 * @copyright SAM GmbH
 */
class JsonHandler extends AjaxHandler
{

    /**
     * Führt eine Controller-Methode aus. $params sollte einen Key "controller"
     * und einen Key "method" enthalten, der die auszuführende Methode angibt.
     * "controller" ist der Klassenname des Controllers.
     *
     * Es wird ein JSON-codierter String der Rückgabeparameter der Controller-
     * Methode zurückgegeben.
     *
     * @param array $params Assoziatives Array der Request-Parameter (typischerweise des HTTP-Requests)
     * @return string JSON kodierte Rückgabeparameter der Controller-Methode.
     */
    public function execute($params){
        // Instantiate JSON Service
        $json = new Services_JSON('SERVICES_JSON_LOOSETYPE'|'SERVICES_JSON_SUPPRESS_ERRORS');

        // Read Controller from GET parameters and get filepath to controller
        $controller = $params['controller'];

        $file = $this->getFilePath($controller);
        if ($file === false) {
            return '';
        } else {
            require_once($file);
        }

        // Read Method from GET parameters, instantiate controller and call its corresponding method
        $method = $params['method'];
        $controller = new $controller($params);

        // Call method on controller
        $result = $controller->$method($params);

        //fuer den Fall, dass Dropdowns ausgegeben werden muessen, darf der zurueckgegebene Wert
        // nicht kodiert werden, weil vor der Ausgabe keine Dekodierung stattfindet (html-Tags werden somit nicht korrekt angezeigt)
        if(isset($params['encoding'])) {
            return $result;
        } else {
            return $json->encode($result);
        }
    }
}